package demo3;

//TODO ArrayList跟LinkedList的区别
public class Demo3 {

    public static void main(String[] args) {
        /*
        1、ArrayList是基于索引的数据接口，它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应，LinkedList是以元素列表的形式存储它的数据，
        每一个元素都和它的前一个和后一个元素链接在一起，在这种情况下，查找某个元素的时间复杂度是O(n)。 ArrayList 是通过数组复制的形式进行扩容的
        2、相对于ArrayList，LinkedList的插入，添加，删除操作速度更快，因为当元素被添加到集合任意位置的时候，不需要像数组那样重新计算大小或者是更新索引。
        3、LinkedList比ArrayList更占内存，因为LinkedList为每一个节点存储了两个引用，一个指向前一个元素，一个指向下一个元素。
        * */

        /*
        * 对比删除操作
        * ArrayList
        * 最终调用的是fastRemove方法 最底层使用System.arraycopy 进行数组copy 然后把最后一个设置成null
        * LinkedList
        * 通过指定序号或者遍历要删除的对象。使用unlink方法更新前节点的后引用和后节点的前引用
        *
        * 遍历操作
        * ArrayList
        * 如果是通过索引形式，由于底层是数组所以可以很快找到
        * 如果是找一个对象，就要遍历所有的对象了。
        * LinkedList
        * 如果是通过索引形式，每次都要调用node(index)，等于遍历
        * 如果是找一个对象，遍历所有对象。
        * 注意这个地方对于ArrayList 遍历可以使用for循环但是对于LinkedList 则需要使用Iterator 因为如果使用for 每次都会调用node方式进行遍历
        *
        * */
    }
}
